package com.designpattern.singleton;

/**
 * @Classname Singleton2
 * @Description 单例模式-懒汉模式
 * @Date 2019/5/11 22:23
 * @Created by xiangty
 * 1. 私有化类的构造方法
 * 2. 定义一个类的对象
 * 3. 定义一个公共方法将创建的对象返回
 */
public class Singleton2 {

    /**
     * 1. 私有化类的构造方法
     */
    private Singleton2() {
    }

    /**
     * 2. 定义一个类的对象
     */
    private static Singleton2 singleton2 = null;

    /**
     * 3. 定义一个公共方法将创建的对象返回
     */
    public static Singleton2 getInstance() {
        if (singleton2 == null) {
            singleton2 = new Singleton2();
        }
        return singleton2;
    }

    /**
     * (优化方法1：使用同步函数)
     */
    public static synchronized Singleton2 getInstanceNew1() {
        if (singleton2 == null) {
            singleton2 = new Singleton2();
        }
        return singleton2;
    }

    /**
     * (优化方法2：使用同步代码块)
     */
    public static Singleton2 getInstanceNew2(){
        synchronized(Singleton2.class){
            if(singleton2 == null){
                singleton2 = new Singleton2();
            }
            return singleton2;
        }
    }

    /**
     * 优化方法3
     */
    public static Singleton2 getInstanceNew3(){
        if(singleton2 == null) { // 解决效率问题
            synchronized (Singleton2.class) {
                if (singleton2 == null) { // 第二次判空操作是为了保证单例对象的唯一性
                    singleton2 = new Singleton2();
                }
            }
        }
        return singleton2;
    }

}
